package util

import (
	"cs-backend/conf"
	"github.com/iris-contrib/middleware/jwt"
	"time"
)

func Jwt() *jwt.Middleware {
	return jwt.New(jwt.Config{
		//这个方法将验证jwt的token
		// 设置一个函数返回秘钥，关键在于return []byte("这里设置秘钥")
		ValidationKeyGetter: func(token *jwt.Token) (interface{}, error) {
			return conf.MySecret, nil
		},

		// Extractor属性可以选择从什么地方获取jwt进行验证，默认从http请求的header中的Authorization字段提取，
		// 也可指定为请求参数中的某个字段
		// 从请求参数token中提取
		// Extractor: jwt.FromParameter("token"), 如：http://xx.xxx.xx.xx/secured?token=xxxxxx
		// 从请求头的Authorization字段中提取，这个是默认值
		Extractor:     jwt.FromAuthHeader,
		SigningMethod: jwt.SigningMethodHS256,
	})
}

func GenerateToken(username, userid string) string {
	// 往jwt中写入了一对值
	token := jwt.NewTokenWithClaims(jwt.SigningMethodHS256, jwt.MapClaims{
		// 根据需求，可以存一些必要的数据
		"username": username,
		"userid":   userid,
		"admin":    true,

		// 签发人
		"iss": "iris",
		// 签发时间
		"iat": time.Now().Unix(),
		// 设定过期时间，便于测试，设置60分钟过期
		"exp": time.Now().Add(24 * 60 * time.Minute * time.Duration(1)).Unix(),
	})

	// Sign and get the complete encoded token as a string using the secret
	// 使用设置的秘钥，签名生成jwt字符串
	tokenString, _ := token.SignedString(conf.MySecret)
	return tokenString
}
